package Day_0228.TCPIP;

/**
 * @author zxc
 * @date 2023/02/28 21:26
 **/
public class FourWaves {
    public static void main(String[] args) {
        /**
         * 谈一谈对于四次挥手的理解
         * ===》
         * 由于TCP连接是全双工通信，所以TCP连接的Client端和Server端都可以主动请求断开TCP连接;
         * 1.第一次挥手 ：
         * （1）即，主动断开方（客户端/服务端）完成了 数据传输工作，从而关闭了主动断开方 - 被动断开方之间的数据传输;（准备关闭对应的Socket连接）
         * （2）主动断开方会发送FIN结束请求报文，同时将该报文的FIN位置置为1，同时发送 主动断开方的序列号（seq = a）;
         * （3）主动断开方进入到FIN_WAIT_1状态;
         *
         * 2.第二次挥手 ：
         * （1）即，被动断开方接收到 主动断开方所发送的FIN结束请求报文，需要对其进行响应;
         * （2）被动断开方发送 ACK确认报文，同时将报文的ACK位置置为1 && 同时发送 被动断开方的确认序列号（ack = a + 1）;
         * （3）被动断开方进入到 CLOSE_WAIT状态;
         * （4）主动断开方接收到ACK确认报文的话，则会进入到FIN_WAIT_2状态;
         * ===》
         * 为什么被动断开方不会立刻去发送FIN结束请求？
         * 原因 ：
         * （1）被动断开方，在接收到主动断开方的FIN结束请求的时候，还在通过TCP连接进行数据的传输;
         * （2）所以，被动断开方不会立刻发送FIN结束请求，断开 被动断开方 - 主动断开方之间的数据传输;
         *  而是会等到被动断开方数据传输完毕之后，才会去发送FIN结束请求，去关闭被动断开方 - 主动断开方之间的数据传输;
         *
         * 3.第三次挥手 ：
         * （1）即，被动断开方数据传输完毕后，可以向主动断开方发送FIN结束请求报文，来关闭被动断开方 - 主动断开方之间的数据传输;
         * （2）同时将该报文的FIN位置 置为1 && 发送 被动断开方的序列号（seq = b）
         * （3）被动断开方进入到LAST_ACK状态;
         *
         * 4.第四次挥手 ：
         * （1）即，主动断开方接收到 被动断开方的FIN结束请求报文，对其进行响应;
         * （2）主动断开方会发送ACK确认请求报文，将该报文的ACK位置 置为1 && 发送 主动断开方的确认序列号（ack = b + 1）;
         * （3）主动断开方进入到TIME_WAIT状态;
         * ===>
         * 等待2MSL时间后，若是再次期间未能够接收到其他报文的话，则主动断开方会进入到CLOSED状态;
         *
         *
         * 5.被动断开方接收到 来自主动断开方的ACK确认请求报文的话，则被动断开方直接进入到CLOSED状态;
         *
         */
    }
}
